﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;    
using Biciq.Datos;
using LogicStudio.Framework.UI.Utilidades;
using Biciq.Silverlight.UI.Clases;
using System.Linq;
using System.Windows.Browser;
namespace Biciq.Silverlight.UI
{
    public class AperturaCajaVistaModelo:VistaModeloBase
    {
        #region variables
        private int _cantiadadBilletesCien;
        private int _cantiadadBilletesCincuenta;
        private int _cantiadadBilletesVeinte;
        private int _cantiadadBilletesDiez;
        private int _cantiadadBilletesCinco;
        private int _cantiadadBilletesUno;
        private int _cantiadadMonedadCincuenta;
        private int _cantidadMonedadVeinteCinco;
        private int _cantidadMonedasDiez;
        private int _cantidadMonedasCinco;
        private int _cantidadMonedasUno;
        
        private decimal _totalBilleteCien;
        private decimal _totalBilleteCincuenta;
        private decimal _totalBilleteVeinte;
        private decimal _totalBilleteDiez;
        private decimal _totalBilleteCinco;
        private decimal _totalBilleteUno;
        private decimal _totalMonedaCincuenta;
        private decimal _totalMonedaVeinteCinco;
        private decimal _totalMonedaDiez;
        private decimal _totalMonedaCinco;
        private decimal _totalMonedaUno;

        private int _cantidadCheques;
        private decimal _valorCheques;
        private decimal _totalCierreCaja;

        private RelayCommand _cancelarCommand;
        private RelayCommand _aceptarCommand;

        private string _cierreCajaEsperado;
        private string _cierreCajaReal;
        private string _nombreReporte;
        private Guid _IdCierreCaja;

        private Visibility _mostrarAceptar;

      
        #endregion

        #region propiedades
        /// <summary>
        /// Muestra la ejecución Aceptar
        /// </summary>
        public Visibility MostrarAceptar
        {
            get { return _mostrarAceptar; }
            set 
            {
                _mostrarAceptar = value;
                RaisePropertyChanged("MostrarAceptar");
            }
        }
        /// <summary>
        /// User Id
        /// </summary>
        public Guid IdUsuario { get; set; }

        /// <summary>
        /// Get or Set CierreCajaReal
        /// </summary>		
        public string CierreCajaReal
        {
            get
            {
                _totalCierreCaja = _valorCheques + _totalBilleteCien + _totalBilleteCinco + _totalBilleteCincuenta + _totalBilleteDiez +
                    _totalBilleteUno + _totalBilleteVeinte + _totalMonedaCinco + _totalMonedaCincuenta + _totalMonedaDiez + _totalMonedaUno + _totalMonedaVeinteCinco;
                _cierreCajaReal = string.Format("Apertura  de caja : {0:C}", _totalCierreCaja);
                return _cierreCajaReal;
            }
            set
            {
                if (_cierreCajaReal == value) return;
                _cierreCajaReal = value;
                RaisePropertyChanged("CierreCajaReal");
            }
        }
        /// <summary>
        /// Get or Set CierreCajaEsperado
        /// </summary>		
        public string CierreCajaEsperado
        {
            get
            {
                return _cierreCajaEsperado;
            }
            set
            {
                if (_cierreCajaEsperado == value) return;
                _cierreCajaEsperado = value;
                RaisePropertyChanged("CierreCajaEsperado");
            }
        }

        public string NombreReporte
        {
            get { return _nombreReporte; }
            set
            {
                _nombreReporte = value;
                RaisePropertyChanged("NombreReporte");

            }
        }
        /// <summary>
        /// Get AceptarCommand
        /// </summary>
        public RelayCommand AceptarCommand
        {
            get 
            {
                return _aceptarCommand ?? (_aceptarCommand = new RelayCommand(ExecuteAceptarCommand));
            }
        }

        /// <summary>
        /// Get CancelarCommand
        /// </summary>
        public RelayCommand CancelarCommand
        {
            get
            {
                return _cancelarCommand ?? (_cancelarCommand = new RelayCommand(ExecuteCancelarCommand));
            }
        }


        /// <summary>
        /// Get or Set ValorCheques
        /// </summary>		
        public decimal ValorCheques
        {
            get
            {
                return _valorCheques;
            }
            set
            {
                if (_valorCheques == value) return;
                _valorCheques = value;
                RaisePropertyChanged("ValorCheques");
                RaisePropertyChanged("CierreCajaReal");
            }
        }
        /// <summary>
        /// Get or Set CantidadCheques
        /// </summary>		
        public int CantidadCheques
        {
            get
            {
                return _cantidadCheques;
            }
            set
            {
                if (_cantidadCheques == value) return;
                _cantidadCheques = value;
                RaisePropertyChanged("CantidadCheques");
            }
        }

        /// <summary>
        /// Get or Set TotalMonedaUno
        /// </summary>		
        public decimal TotalMonedaUno
        {
            get
            {
                return _totalMonedaUno;
            }
            set
            {
                if (_totalMonedaUno == value) return;
                _totalMonedaUno = value;
                RaisePropertyChanged("TotalMonedaUno");
                RaisePropertyChanged("CierreCajaReal");
            }
        }

        /// <summary>
        /// Get or Set TotalMonedaCinco
        /// </summary>		
        public decimal TotalMonedaCinco
        {
            get
            {
                return _totalMonedaCinco;
            }
            set
            {
                if (_totalMonedaCinco == value) return;
                _totalMonedaCinco = value;
                RaisePropertyChanged("TotalMonedaCinco");
                RaisePropertyChanged("CierreCajaReal");
            }
        }
        /// <summary>
        /// Get or Set TotalMonedaDiez
        /// </summary>		
        public decimal TotalMonedaDiez
        {
            get
            {
                return _totalMonedaDiez;
            }
            set
            {
                if (_totalMonedaDiez == value) return;
                _totalMonedaDiez = value;
                RaisePropertyChanged("TotalMonedaDiez");
                RaisePropertyChanged("CierreCajaReal");
            }
        }

        /// <summary>
        /// Get or Set TotalMonedaVeinteCinco
        /// </summary>		
        public decimal TotalMonedaVeinteCinco
        {
            get
            {
                return _totalMonedaVeinteCinco;
            }
            set
            {
                if (_totalMonedaVeinteCinco == value) return;
                _totalMonedaVeinteCinco = value;
                RaisePropertyChanged("TotalMonedaVeinteCinco");
                RaisePropertyChanged("CierreCajaReal");
            }
        }
        /// <summary>
        /// Get or Set TotalMonedaCincuenta
        /// </summary>		
        public decimal TotalMonedaCincuenta
        {
            get
            {
                return _totalMonedaCincuenta;
            }
            set
            {
                if (_totalMonedaCincuenta == value) return;
                _totalMonedaCincuenta = value;
                RaisePropertyChanged("TotalMonedaCincuenta");
                RaisePropertyChanged("CierreCajaReal");
            }
        }

        /// <summary>
        /// Get or Set TotalBilleteUno
        /// </summary>		
        public decimal TotalBilleteUno
        {
            get
            {
                return _totalBilleteUno;
            }
            set
            {
                if (_totalBilleteUno == value) return;
                _totalBilleteUno = value;
                RaisePropertyChanged("TotalBilleteUno");
                RaisePropertyChanged("CierreCajaReal");
            }
        }
        /// <summary>
        /// Get or Set TotalBilleteCinco
        /// </summary>		
        public decimal TotalBilleteCinco
        {
            get
            {
                return _totalBilleteCinco;
            }
            set
            {
                if (_totalBilleteCinco == value) return;
                _totalBilleteCinco = value;
                RaisePropertyChanged("TotalBilleteCinco");
                RaisePropertyChanged("CierreCajaReal");
            }
        }
        
        /// <summary>
        /// Get or Set TotalBilleteDiez
        /// </summary>		
        public decimal TotalBilleteDiez
        {
            get
            {
                return _totalBilleteDiez;
            }
            set
            {
                if (_totalBilleteDiez == value) return;
                _totalBilleteDiez = value;
                RaisePropertyChanged("TotalBilleteDiez");
                RaisePropertyChanged("CierreCajaReal");
            }
        }

        /// <summary>
        /// Get or Set TotalBilleteVeinte
        /// </summary>		
        public decimal TotalBilleteVeinte
        {
            get
            {
                return _totalBilleteVeinte;
            }
            set
            {
                if (_totalBilleteVeinte == value) return;
                _totalBilleteVeinte = value;
                RaisePropertyChanged("TotalBilleteVeinte");
                RaisePropertyChanged("CierreCajaReal");
            }
        }
        /// <summary>
        /// Get or Set TotalBilleteCincuenta
        /// </summary>		
        public decimal TotalBilleteCincuenta
        {
            get
            {
                return _totalBilleteCincuenta;
            }
            set
            {
                if (_totalBilleteCincuenta == value) return;
                _totalBilleteCincuenta = value;
                RaisePropertyChanged("TotalBilleteCincuenta");
                RaisePropertyChanged("CierreCajaReal");
            }
        }
        /// <summary>
        /// Get or Set TotalBilleteCien
        /// </summary>		
        public decimal TotalBilleteCien
        {
            get
            {
                return _totalBilleteCien;
            }
            set
            {
                if (_totalBilleteCien == value) return;
                _totalBilleteCien = value;
                RaisePropertyChanged("TotalBilleteCien");
                RaisePropertyChanged("CierreCajaReal");
            }
        }
        
        /// <summary>
        /// Get or Set CantidadMonedasUno
        /// </summary>		
        public int CantidadMonedasUno
        {
            get
            {
                return _cantidadMonedasUno;
            }
            set
            {
                if (_cantidadMonedasUno == value) return;
                _cantidadMonedasUno = value;
                TotalMonedaUno = decimal.Parse(_cantidadMonedasUno.ToString()) * 0.01m;
                RaisePropertyChanged("CantidadMonedasUno");
            }
        }

        /// <summary>
        /// Get or Set CantidadMonedasCinco
        /// </summary>		
        public int CantidadMonedasCinco
        {
            get
            {
                return _cantidadMonedasCinco;
            }
            set
            {
                if (_cantidadMonedasCinco == value) return;
                _cantidadMonedasCinco = value;
                TotalMonedaCinco = decimal.Parse(_cantidadMonedasCinco.ToString()) * 0.05m;
                RaisePropertyChanged("CantidadMonedasCinco");
            }
        }


        /// <summary>
        /// Get or Set CantidadMonedasDiez
        /// </summary>		
        public int CantidadMonedasDiez
        {
            get
            {
                return _cantidadMonedasDiez;
            }
            set
            {
                if (_cantidadMonedasDiez == value) return;
                _cantidadMonedasDiez = value;
                TotalMonedaDiez = decimal.Parse(_cantidadMonedasDiez.ToString()) * 0.10m;
                RaisePropertyChanged("CantidadMonedasDiez");
            }
        }

        /// <summary>
        /// Get or Set CantidadMonedadVeinteCinco
        /// </summary>		
        public int CantidadMonedadVeinteCinco
        {
            get
            {
                return _cantidadMonedadVeinteCinco;
            }
            set
            {
                if (_cantidadMonedadVeinteCinco == value) return;
                _cantidadMonedadVeinteCinco = value;
                TotalMonedaVeinteCinco = decimal.Parse(_cantidadMonedadVeinteCinco.ToString()) * 0.25m;
                RaisePropertyChanged("CantidadMonedadVeinteCinco");
            }
        }

        /// <summary>
        /// Get or Set CantiadadMonedadCincuenta
        /// </summary>		
        public int CantiadadMonedadCincuenta
        {
            get
            {
                return _cantiadadMonedadCincuenta;
            }
            set
            {
                if (_cantiadadMonedadCincuenta == value) return;
                _cantiadadMonedadCincuenta = value;
                TotalMonedaCincuenta = decimal.Parse(_cantiadadMonedadCincuenta.ToString()) * 0.50m;
                RaisePropertyChanged("CantiadadMonedadCincuenta");
            }
        }
        

        /// <summary>
        /// Get or Set CantiadadBilletesUno
        /// </summary>		
        public int CantiadadBilletesUno
        {
            get
            {
                return _cantiadadBilletesUno;
            }
            set
            {
                if (_cantiadadBilletesUno == value) return;
                _cantiadadBilletesUno = value;
                TotalBilleteUno = decimal.Parse(_cantiadadBilletesUno.ToString()) * 1.00m;
                RaisePropertyChanged("CantiadadBilletesUno");
            }
        }


        /// <summary>
        /// Get or Set CantiadadBilletesCinco
        /// </summary>		
        public int CantiadadBilletesCinco
        {
            get
            {
                return _cantiadadBilletesCinco;
            }
            set
            {
                if (_cantiadadBilletesCinco == value) return;
                _cantiadadBilletesCinco = value;
                TotalBilleteCinco = decimal.Parse(_cantiadadBilletesCinco.ToString()) * 5.00m;
                RaisePropertyChanged("CantiadadBilletesCinco");
            }
        }

        /// <summary>
        /// Get or Set CantiadadBilletesDiez
        /// </summary>		
        public int CantiadadBilletesDiez
        {
            get
            {
                return _cantiadadBilletesDiez;
            }
            set
            {
                if (_cantiadadBilletesDiez == value) return;
                _cantiadadBilletesDiez = value;
                TotalBilleteDiez = decimal.Parse(_cantiadadBilletesDiez.ToString()) * 10.00m;
                RaisePropertyChanged("CantiadadBilletesDiez");
            }
        }




        /// <summary>
        /// Get or Set CantiadadBilletesVeinte
        /// </summary>		
        public int CantiadadBilletesVeinte
        {
            get
            {
                return _cantiadadBilletesVeinte;
            }
            set
            {
                if (_cantiadadBilletesVeinte == value) return;
                _cantiadadBilletesVeinte = value;
                TotalBilleteVeinte = decimal.Parse(_cantiadadBilletesVeinte.ToString()) * 20.00m;
                RaisePropertyChanged("CantiadadBilletesVeinte");
            }
        }


        /// <summary>
        /// Get or Set CantiadadBilletesCincuenta
        /// </summary>		
        public int CantiadadBilletesCincuenta
        {
            get
            {
                return _cantiadadBilletesCincuenta;
            }
            set
            {
                if (_cantiadadBilletesCincuenta == value) return;
                _cantiadadBilletesCincuenta = value;
                TotalBilleteCincuenta = decimal.Parse(_cantiadadBilletesCincuenta.ToString()) * 50.00m;
                RaisePropertyChanged("CantiadadBilletesCincuenta");
            }
        }

        /// <summary>
        /// Get or Set CantiadadBilletesCien
        /// </summary>		
        public int CantiadadBilletesCien
        {
            get
            {
                return _cantiadadBilletesCien;
            }
            set
            {
                if (_cantiadadBilletesCien == value) return;
                _cantiadadBilletesCien = value;
                TotalBilleteCien = decimal.Parse(_cantiadadBilletesCien.ToString()) * 100.00m;
                RaisePropertyChanged("CantiadadBilletesCien");
            }
        }
        #endregion

        #region constructor
        /// <summary>
        /// Get an instance of cierre caja
        /// </summary>
        public AperturaCajaVistaModelo()
        {
            InicializarMensajesError();
            BiciqContexto.AperturaCajas.Clear();
            MostrarAceptar = Visibility.Visible;
            BiciqContexto.Load(BiciqContexto.AperturaCajaDiaQuery()).Completed+=delegate
            {
                if (BiciqContexto.AperturaCajas.FirstOrDefault() != null)
                {
                    AgregarMensajeError("Ya se ha realizado Apertura de Caja el día de hoy.");
                    MostrarErrores = Visibility.Visible;
                    MostrarAceptar = Visibility.Collapsed;
                    return;
                }

                ListaErrores = new System.Collections.Generic.List<ManejoError>();
                InitEvents();
            };

          
        }

        public void InitEvents()
        {
            InicializarMensajesError();
            IdUsuario = CacheCliente.UsuarioLogueado.id;
            Procesando = true;
            //ProxyTramites.ObtenerInformacionCierreCajaAsync(IdUsuario, ev => ProxyObtenerInformacionCierreCajaCompleted(null, ev));
        }
        #endregion

        #region metodos privados

        /// <summary>
        /// Ejecuta el click del boton aceptar
        /// </summary>
        /// <param name="parameter">parameter</param>
        private void ExecuteAceptarCommand(object parameter)
        {
            ListaErrores.Clear();
            MostrarErrores = Visibility.Collapsed;
            if (_totalCierreCaja > 0)
            {
                EjecutarGuardar();
            }
            else
            {
                Action accion = EjecutarGuardar;
                LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar("Esta de seguro de Aperturar Caja con un valor de $ 0,00", "Apertura de Caja sin valor ", LogicStudio.Framework.UI.Utilidades.TipoVentana.Advertencia, accion);

            }
        }
        private void EjecutarGuardar()
        {
            AperturaCaja cierre = new AperturaCaja();
            cierre.IdUsuario = IdUsuario;
            cierre.FechaAperturaCaja = DateTime.Now;
            cierre.ValorAperturaCaja = _totalCierreCaja;
            cierre.TotalBilleteCien = TotalBilleteCien;
            cierre.TotalBilleteCinco = TotalBilleteCinco;
            cierre.TotalBilleteCincuenta = TotalBilleteCincuenta;
            cierre.TotalBilleteDiez = TotalBilleteDiez;
            cierre.TotalBilleteUno = TotalBilleteUno;
            cierre.TotalBilleteVeinte = TotalBilleteVeinte;
            cierre.TotalMonedaCinco = TotalMonedaCinco;
            cierre.TotalMonedaCincuenta = TotalMonedaCincuenta;
            cierre.TotalMonedaDiez = TotalMonedaDiez;
            cierre.TotalMonedaUno = TotalMonedaUno;
            cierre.TotalMonedaVeinteCinco = TotalMonedaVeinteCinco;

            if (CantidadCheques == 0 && ValorCheques > 0)
                AgregarMensajeError("Ingrese una cantidad para los cheques");
            if (CantidadCheques > 0 && ValorCheques == 0)
                AgregarMensajeError("Ingrese un valor para la cantidad de cheques");


            cierre.CantidadCheques = CantidadCheques;
            cierre.ValorCheques = ValorCheques;

            if (_IdCierreCaja != Guid.Empty)
                cierre.IdAperturaCaja = _IdCierreCaja;

            if (ListaErrores.Count > 0)
            {
                MostrarErrores = Visibility.Visible;
            }
            else
            {
                Procesando = true;

                BiciqContexto.AperturaCajas.Clear();
                BiciqContexto.Load(BiciqContexto.GetAperturaCajaFechaQuery()).Completed += delegate
                {
                    if (BiciqContexto.AperturaCajas.Count>0)
                    {
                        Procesando=false;
                        LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar("Ya se ha realizado Apertura de Caja", "Error Apertura de Caja", TipoVentana.Error);
                        return ;
                    }

                    BiciqContexto.AperturaCajas.Add(cierre);
                    BiciqContexto.SubmitChanges().Completed += delegate
                    {
                        LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar("El cuadre de caja se a almacenado con éxito", "Apertura de Caja Exitosa", TipoVentana.Ok);

                        CierreCajaEsperado = string.Format("Cierre de caja esperado: {0:C}", 0);
                        ExecuteCancelarCommand(null);

                        Procesando = false;

                        var urlReporte = ConfigurationManager.AppSettings["WebSite"].ToString() + ConfigurationManager.AppSettings["CarpetaReportes"].ToString();
                        HtmlPage.Window.Navigate(new System.Uri(urlReporte + "?Reporte=ReporteAperturaCaja"), "_blank");


                    };
                };
                //  ProxyTramites.GuardarCierreCajaAsync(cierre, ev => ProxyGuardarCierreCajaCompleted(null, ev));
            }
        }
        

        /// <summary>
        /// Completed method for GuardarCierreCajaAsync
        /// </summary>
        /// <param name="sender">Object sender</param>
        /// <param name="e">Event Arguments</param>
        //private void ProxyGuardarCierreCajaCompleted(object sender, GuardarCierreCajaCompletedEventArgs e)
        //{
        //    if (e.Error != null) return;
        //    if (!e.Result.Estado)
        //        throw new Exception(e.Result.Mensaje);

        //    string localReportes = ConfigurationManager.AppSettings["LocalReportes"].ToString();
        //    DateTime fechaactual = DateTime.Now;
        //    Guid idempresa = EmpleadoLogueado.EmpresaId.GetValueOrDefault();
        //    string nombreEmpresa = EmpleadoLogueado.Empresa.Nombre;
        //    NombreReporte = "ReporteCierreCaja";

        //    LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar("El cuadre de caja se a almacenado con éxito", "Registro Mercantil", TipoVentana.Ok);

        //    CierreCajaEsperado = string.Format("Cierre de caja esperado: {0:C}", 0);
        //    ExecuteCancelarCommand(null);

        //    IsBusy = false;

        //    HtmlPage.Window.Navigate(new System.Uri(@localReportes + "/Reportes/ReporteCierreCaja.aspx?FechaInicio=" + fechaactual + "&nombreEmpresa=" + nombreEmpresa + "&empresa=" + idempresa + "&reporte=" + NombreReporte), "_blank");

        //}

        /// <summary>
        /// Ejecuta el click del boton cancelar
        /// </summary>
        /// <param name="parameter">parameter</param>
        private void ExecuteCancelarCommand(object parameter)
        {
            CantiadadBilletesCien = 0;
            CantiadadBilletesCinco = 0;
            CantiadadBilletesCincuenta = 0;
            CantiadadBilletesDiez = 0;
            CantiadadBilletesUno = 0;
            CantiadadBilletesVeinte = 0;
            CantiadadMonedadCincuenta = 0;
            CantidadCheques = 0;
            ValorCheques = 0;
            CantidadMonedadVeinteCinco = 0;
            CantidadMonedasCinco = 0;
            CantidadMonedasDiez = 0;
            CantidadMonedasUno = 0;
            _totalCierreCaja = 0;
            RaisePropertyChanged("CierreCajaReal");
            MostrarErrores = Visibility.Collapsed;
            ListaErrores.Clear();

        }

        /// <summary>
        /// Completed method for ObtenerInformacionCierreCajaAsync
        /// </summary>
        /// <param name="sender">Object sender</param>
        /// <param name="e">Event Arguments</param>
        //private void ProxyObtenerInformacionCierreCajaCompleted(object sender, ObtenerInformacionCierreCajaCompletedEventArgs e)
        //{
        //    if (e.Error != null) return;
        //    InformacionCierreCaja result = e.Result;
        //    CierreCajaEsperado = string.Format("Cierre de caja esperado: {0:C}", result.TotalCajaEsperado);

        //    if(result.CierreCaja!=null)
        //        _IdCierreCaja = result.CierreCaja.IdCierreCaja;
        //    IsBusy = false;
        //}

        /// <summary>
        /// Setea los valores obtenidos en el cierre de caja
        /// </summary>
        /// <param name="values">valores obtenidos</param>
        private void SetValuesCierreCaja(AperturaCaja values)
        {
            _IdCierreCaja = values.IdAperturaCaja;

            CantiadadBilletesCien = Convert.ToInt32(values.TotalBilleteCien / 100.00m);
            CantiadadBilletesCinco = Convert.ToInt32(values.TotalBilleteCinco / 5.00m);
            CantiadadBilletesCincuenta = Convert.ToInt32(values.TotalBilleteCincuenta / 50.00m);
            CantiadadBilletesDiez = Convert.ToInt32(values.TotalBilleteDiez / 10.00m);
            CantiadadBilletesUno = Convert.ToInt32(values.TotalBilleteUno / 1.00m);
            CantiadadBilletesVeinte = Convert.ToInt32(values.TotalBilleteVeinte / 20.00m);

            CantidadCheques = values.CantidadCheques;
            ValorCheques = values.ValorCheques;

            CantidadMonedadVeinteCinco = Convert.ToInt32(values.TotalMonedaVeinteCinco / 0.25m);
            CantidadMonedasCinco = Convert.ToInt32(values.TotalMonedaCinco / 0.05m);
            CantidadMonedasDiez = Convert.ToInt32(values.TotalMonedaDiez / 0.10m);
            CantidadMonedasUno = Convert.ToInt32(values.TotalMonedaUno / 0.01m);
            CantiadadMonedadCincuenta = Convert.ToInt32(values.TotalMonedaCincuenta / 0.50m);
        }

        #endregion
    }
}
